<?php


namespace app\src\redis;

use app\src\adlist\adlist;
use app\src\dict\dict;
use app\src\redis\redisObject as robj;

/**
 *
 *
 * User: Implement hdjahs@qq.com
 * Date: 2020/12/5 20:59
 */
class redisClient extends config
{


    // 套接字描述符
    public $fd;

    // 当前正在使用的数据库
    public $db;

    // 当前正在使用的数据库的 id （号码）
    public $dictid;

    // 客户端的名字
    public $name;             /* As set by CLIENT SETNAME */

    // 查询缓冲区
    public $querybuf;

    // 查询缓冲区长度峰值
    public $querybuf_peak;   /* Recent (100ms or more) peak of querybuf size */

    // 参数数量
    public $argc;

    // 参数对象数组
    public $argv;

    // 记录被客户端执行的命令
    public $cmd;

    public $lastcmd;

    // 请求的类型：内联命令还是多条命令
    public $reqtype;

    // 剩余未读取的命令内容数量
    public $multibulklen;       /* number of multi bulk arguments left to read */

    // 命令内容的长度
    public $bulklen;           /* length of bulk argument in multi bulk request */

    // 回复链表
    public $reply;

    // 回复链表中对象的总大小
    public $reply_bytes; /* Tot bytes of objects in reply list */

    // 已发送字节，处理 short write 用
    public $sentlen;            /* Amount of bytes already sent in the current
                               buffer or object being sent. */

    // 创建客户端的时间
    public $ctime;           /* Client creation time */

    // 客户端最后一次和服务器互动的时间
    public $lastinteraction; /* time of the last interaction, used for timeout */

    // 客户端的输出缓冲区超过软性限制的时间
    public $obuf_soft_limit_reached_time;

    // 客户端状态标志
    public $flags;              /* REDIS_SLAVE | REDIS_MONITOR | REDIS_MULTI ... */

    // 当 server.requirepass 不为 NULL 时
    // 代表认证的状态
    // 0 代表未认证， 1 代表已认证
    public $authenticated;      /* when requirepass is non-NULL */

    // 复制状态
    public $replstate;          /* replication state if this is a slave */
    // 用于保存主服务器传来的 RDB 文件的文件描述符
    public $repldbfd;           /* replication DB file descriptor */

    // 读取主服务器传来的 RDB 文件的偏移量
    public $repldboff;        /* replication DB file offset */
    // 主服务器传来的 RDB 文件的大小
    public $repldbsize;       /* replication DB file size */

    public $replpreamble;       /* replication DB preamble. */

    // 主服务器的复制偏移量
    public $reploff;      /* replication offset if this is our master */
    // 从服务器最后一次发送 REPLCONF ACK 时的偏移量
    public $repl_ack_off; /* replication ack offset, if this is a slave */
    // 从服务器最后一次发送 REPLCONF ACK 的时间
    public $repl_ack_time;/* replication ack time, if this is a slave */
    // 主服务器的 master run ID
    // 保存在客户端，用于执行部分重同步
    public $replrunid = self::REDIS_RUN_ID_SIZE + 1; /* master run id if this is a master */


    // 从服务器的监听端口号
    public $slave_listening_port; /* As configured with: SLAVECONF listening-port */

    // 事务状态
    public $mstate;      /* MULTI/EXEC state */

    // 阻塞类型
    public $btype;              /* Type of blocking op if REDIS_BLOCKED. */
    // 阻塞状态
    public $bpop;     /* blocking state */

    // 最后被写入的全局复制偏移量
    public $woff;         /* Last write global replication offset. */

    // 被监视的键
    public $watched_keys;     /* Keys WATCHED for MULTI/EXEC CAS */

    // 这个字典记录了客户端所有订阅的频道
    // 键为频道名字，值为 NULL
    // 也即是，一个频道的集合
    public $pubsub_channels;  /* channels a client is interested in (SUBSCRIBE) */

    // 链表，包含多个 pubsubPattern 结构
    // 记录了所有订阅频道的客户端的信息
    // 新 pubsubPattern 结构总是被添加到表尾
    public $pubsub_patterns;  /* patterns a client is interested in (SUBSCRIBE) */
    public $peerid;             /* Cached peer ID. */

    /* Response buffer */
    // 回复偏移量
    public $bufpos;
    // 回复缓冲区
    public $buf = self::REDIS_REPLY_CHUNK_BYTES;

    public function __construct()
    {
        $this->db = new redisDb();
        $this->name = new redisObject();
        $this->argv = new redisObject();
        $this->cmd = new redisCommand();
        $this->lastcmd = new redisCommand();
        $this->reply = new adlist();
        $this->mstate = new multiState();
        $this->bpop = new blockingState();
        $this->watched_keys = new adlist();
        $this->pubsub_channels = new dict();
        $this->pubsub_patterns = new adlist();

    }
}

